/*
 * Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.meisupic.copyright.util;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * String字符串工具类.
 *
 * @author zenghao
 * @company：广州领课网络科技有限公司（龙果学院 www.roncoo.com）.
 */
public final class StringUtil {

  private static final Log LOG = LogFactory.getLog(StringUtil.class);

  private static Random random = new Random();

  /**
   * 私有构造方法,将该工具类设为单例模式.
   */
  private StringUtil() {
  }

  /**
   * 函数功能说明 ： 判断字符串是否为空 . 修改者名字： 修改日期： 修改内容：
   *
   * @return boolean
   * @参数： @param str
   * @参数： @return
   */
  public static boolean isEmpty(String str) {
    return null == str || "".equals(str);
  }

  /**
   * 函数功能说明 ： 判断对象数组是否为空. 修改者名字： 修改日期： 修改内容：
   *
   * @return boolean
   * @参数： @param obj
   * @参数： @return
   */
  public static boolean isEmpty(Object[] obj) {
    return null == obj || 0 == obj.length;
  }

  /**
   * 函数功能说明 ： 判断对象是否为空. 修改者名字： 修改日期： 修改内容：
   *
   * @return boolean
   * @参数： @param obj
   * @参数： @return
   */
  public static boolean isEmpty(Object obj) {
    if (null == obj) {
      return true;
    }
    if (obj instanceof String) {
      return ((String) obj).trim().isEmpty();
    }
    return !(obj instanceof Number) ? false : false;
  }

  /**
   * 函数功能说明 ： 判断集合是否为空. 修改者名字： 修改日期： 修改内容：
   *
   * @return boolean
   * @参数： @param obj
   * @参数： @return
   */
  public static boolean isEmpty(List<?> obj) {
    return null == obj || obj.isEmpty();
  }

  /**
   * 函数功能说明 ： 判断Map集合是否为空. 修改者名字： 修改日期： 修改内容：
   *
   * @return boolean
   * @参数： @param obj
   * @参数： @return
   */
  public static boolean isEmpty(Map<?, ?> obj) {
    return null == obj || obj.isEmpty();
  }

  /**
   * 函数功能说明 ： 获得文件名的后缀名. 修改者名字： 修改日期： 修改内容：
   *
   * @return String
   * @参数： @param fileName
   * @参数： @return
   */
  public static String getExt(String fileName) {
    return fileName.substring(fileName.lastIndexOf(".") + 1);
  }

  /**
   * 获取去掉横线的长度为32的UUID串.
   *
   * @return uuid.
   * @author WuShuicheng.
   */
  public static String get32UUID() {
    return UUID.randomUUID().toString().replace("-", "");
  }

  /**
   * 获取带横线的长度为36的UUID串.
   *
   * @return uuid.
   * @author WuShuicheng.
   */
  public static String get36UUID() {
    return UUID.randomUUID().toString();
  }

  /**
   * 验证一个字符串是否完全由纯数字组成的字符串，当字符串为空时也返回false.
   *
   * @param str 要判断的字符串 .
   * @return true or false .
   * @author WuShuicheng .
   */
  public static boolean isNumeric(String str) {
    if (StringUtils.isBlank(str)) {
      return false;
    } else {
      return str.matches("\\d*");
    }
  }

  /**
   * 计算采用utf-8编码方式时字符串所占字节数
   */
  public static int getByteSize(String content) {
    int size = 0;
    if (null != content) {
      try {
        // 汉字采用utf-8编码时占3个字节
        size = content.getBytes("utf-8").length;
      } catch (UnsupportedEncodingException e) {
        LOG.error(e);
      }
    }
    return size;
  }

  /**
   * 函数功能说明 ： 截取字符串拼接in查询参数. 修改者名字： 修改日期： 修改内容：
   *
   * @return String
   * @参数： @param ids
   * @参数： @return
   */
  public static List<String> getInParam(String param) {
    boolean flag = param.contains(",");
    List<String> list = new ArrayList<String>();
    if (flag) {
      list = Arrays.asList(param.split(","));
    } else {
      list.add(param);
    }
    return list;
  }

  public static int getRangeRandomCode(int min,int max){
    return random.nextInt(max)%(max-min+1) + min;
  }

  /**
   * <p>
   * 正则表达式匹配
   * </p>
   *
   * @param regex
   *            正则表达式字符串
   * @param str
   *            要匹配的字符串
   * @return 如果str 符合 regex的正则表达式格式,返回true, 否则返回 false;
   */
  public static boolean match(String regex, String str) {
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(str);
    return matcher.matches();
  }
}
